package com.sky.service.impl;

import com.sky.dto.BorrowingTrendQueryDTO;
import com.sky.entity.Userborrowhistory;
import com.sky.mapper.UserborrowhistoryMapper;
import com.sky.service.BorrowingTrendService;
import com.sky.vo.BorrowingTrendVO;
import com.sky.vo.BorrowingTrend7daysVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * 借阅趋势统计服务实现类
 * 实现了不同时间维度（日、周、月）的借阅数量统计
 * 支持同比和环比两种对比方式：
 * - 同比：与去年同期数据对比
 * - 环比：与上一周期数据对比
 * 
 * 主要功能：
 * 1. 按时间维度统计借阅趋势
 * 2. 获取最近7天的借阅趋势数据
 * 3. 支持多种统计对比方式
 */
@Service
@Slf4j
public class BorrowingTrendServiceImpl implements BorrowingTrendService {

    @Autowired
    private UserborrowhistoryMapper userborrowhistoryMapper;

    /**
     * 获取借阅趋势统计数据
     * 根据指定的时间单位和对比类型，统计借阅数量趋势
     * 
     * 统计规则：
     * 1. 按日统计：
     *    - 统计范围：最近7天
     *    - 时间格式：MM-dd
     *    - 同比：去年同日数据
     *    - 环比：上一个7天周期对应日数据
     * 
     * 2. 按周统计：
     *    - 统计范围：最近4周
     *    - 时间格式：第X周
     *    - 同比：去年同周数据
     *    - 环比：上一个4周周期对应周数据
     * 
     * 3. 按月统计：
     *    - 统计范围：最近6个月
     *    - 时间格式：MM月
     *    - 同比：去年同月数据
     *    - 环比：上一月数据
     *
     * @param queryDTO 查询条件，包含：
     *                - timeUnit: 时间单位（day/week/month）
     *                - compareType: 对比类型（yoy/mom）
     * @return 统计结果，包含：
     *         - xAxis: 时间轴数据
     *         - current: 当前周期数据
     *         - compare: 对比周期数据
     */
    @Override
    public BorrowingTrendVO getBorrowingTrend(BorrowingTrendQueryDTO queryDTO) {
        String timeUnit = queryDTO.getTimeUnit();
        String compareType = queryDTO.getCompareType();
        
        // 获取当前时间
        LocalDate now = LocalDate.now();
        List<String> xAxis = new ArrayList<>();
        List<Integer> current = new ArrayList<>();
        List<Integer> compare = new ArrayList<>();

        // 根据不同的时间单位和对比类型计算时间范围
        switch (timeUnit) {
            case "day":
                // 最近7天的数据
                for (int i = 6; i >= 0; i--) {
                    LocalDate date = now.minusDays(i);
                    xAxis.add(date.format(DateTimeFormatter.ofPattern("MM-dd")));
                    current.add(userborrowhistoryMapper.countByDate(date));
                    
                    if ("yoy".equals(compareType)) {
                        // 同比（去年同期）
                        compare.add(userborrowhistoryMapper.countByDate(date.minusYears(1)));
                    } else {
                        // 环比（上一个7天周期）
                        compare.add(userborrowhistoryMapper.countByDate(date.minusDays(7)));
                    }
                }
                break;
                
            case "week":
                // 最近4周的数据
                for (int i = 3; i >= 0; i--) {
                    LocalDate weekStart = now.minusWeeks(i);
                    xAxis.add("第" + (4-i) + "周");
                    current.add(userborrowhistoryMapper.countByWeek(weekStart));
                    
                    if ("yoy".equals(compareType)) {
                        compare.add(userborrowhistoryMapper.countByWeek(weekStart.minusYears(1)));
                    } else {
                        compare.add(userborrowhistoryMapper.countByWeek(weekStart.minusWeeks(4)));
                    }
                }
                break;
                
            case "month":
                // 最近6个月的数据
                for (int i = 5; i >= 0; i--) {
                    LocalDate monthStart = now.minusMonths(i);
                    xAxis.add(monthStart.format(DateTimeFormatter.ofPattern("MM月")));
                    current.add(userborrowhistoryMapper.countByMonth(monthStart));
                    
                    if ("yoy".equals(compareType)) {
                        compare.add(userborrowhistoryMapper.countByMonth(monthStart.minusYears(1)));
                    } else {
                        compare.add(userborrowhistoryMapper.countByMonth(monthStart.minusMonths(1)));
                    }
                }
                break;
        }

        return BorrowingTrendVO.builder()
                .xAxis(xAxis)
                .current(current)
                .compare(compare)
                .build();
    }

    /**
     * 获取最近7天的借阅趋势数据
     * @return 借阅趋势数据
     */
    @Override
    public BorrowingTrend7daysVO getBorrowingTrend7days() {
        // 获取最近7天的日期列表
        List<String> dates = new ArrayList<>();
        List<Integer> values = new ArrayList<>();
        LocalDate today = LocalDate.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        // 生成最近7天的日期并查询每天的借阅数量
        for (int i = 6; i >= 0; i--) {
            LocalDate date = today.minusDays(i);
            String dateStr = date.format(formatter);
            dates.add(dateStr);
            
            // 查询该日期的借阅数量
            Integer count = userborrowhistoryMapper.countByDate(date);
            values.add(count != null ? count : 0);
        }

        return BorrowingTrend7daysVO.builder()
                .dates(dates)
                .values(values)
                .build();
    }
}